/**
 * 开发者   : Marco
 * 创建时间 : 2015年12月8日, 上午12:36
 */

#ifdef __cplusplus

#include "simple.h"

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

namespace marco {
namespace mysql {

char* simple::host_ = NULL;
char* simple::user_ = NULL;
char* simple::password_ = NULL;
char* simple::dbname_ = NULL;
unsigned short simple::port_ = 0;

simple::simple(void) {
    while (!(mysql_ = mysql_init(NULL))) // 执行一次的话, 不知道为什么多线程同时构造对象的时候有时候会返回NULL, 并发问题? FIXME
	;
}

simple::~simple(void) {
    if (res_) mysql_free_result(res_);
    mysql_close(mysql_);
}

/**
 * 连接
 * @return 连接结果
 */
bool simple::connect(void) {
    if (mysql_real_connect(mysql_, host_, user_, password_, dbname_, port_, NULL, 0) == NULL) {
	return false;
    }
    mysql_set_character_set(mysql_, "utf8"); // 设置连接字符集
    return true;
}

/**
 * 连接到指定的数据库
 * @param dbName 数据库名
 */
bool simple::connect(const char* dbname) {
    if (mysql_real_connect(mysql_, host_, user_, password_, dbname, port_, NULL, 0) == NULL) {
	return false;
    }
    mysql_set_character_set(mysql_, "utf8"); // 设置连接字符集
    return true;
}

/**
 * 仅连接,不指定数据库
 */
bool simple::connectNoDb(void) {
    if (mysql_real_connect(mysql_, host_, user_, password_, NULL, port_, NULL, 0) == NULL) {
	return false;
    }
    mysql_set_character_set(mysql_, "utf8"); // 设置连接字符集
    return true;
}

/**
 * 连接到指定的位置
 * @param host 服务器主机
 * @param user 用户名
 * @param password 密码
 * @param port 端口
 * @param dbname 数据库用户名
 * @return 是否连接成功
 */
bool simple::connect(const char *host, const char *user, const char *password, unsigned short port, const char* dbname) {
    if (mysql_real_connect(mysql_, host, user, password, dbname, port, NULL, 0) == NULL) {
	return false;
    }
    mysql_set_character_set(mysql_, "utf8"); // 设置连接字符集
    return true;
}

/**
 * 查询
 * @param sql SQL语句
 * @param len 语句长度
 * @return 查询结果
 */
bool simple::query(const char* sql, int len) {
    if (mysql_real_query(mysql_, sql, len)) // 非0表示失败, 0成功
	return false;
    return true;
}

/**
 * 选择数据库
 * @param db 数据库名称
 * @return 执行结果
 */
bool simple::selectDb(const char* db) {
    if (mysql_select_db(mysql_, db)) // 非0表示失败, 0成功
	return false;
    return true;
}

/**
 * 获取查询数据
 * @return 获取结果
 */
bool simple::getResult(void) {
    if ((res_ = mysql_store_result(mysql_))) { // 成功
	return true;
    }
    return false;
}

/**
 * 使用结果
 * @return 
 */
bool simple::useResult(void) {
    if ((res_ = mysql_use_result(mysql_))) { // 成功
	return true;
    }
    return false;
}

/**
 * 释放查询数据
 */
void simple::freeResult(void) {
    if (res_) {
	mysql_free_result(res_);
	res_ = nullptr;
    }
}

/**
 * 设置连接信息
 * @param host 主机地址
 * @param user 用户名
 * @param password 密码
 * @param port 端口
 * @param dbname 数据库名
 */
void simple::setConnectionInfo(const char* host, const char* user, const char* password, unsigned short port, const char* dbname) {
    host_ = (char *)malloc(strlen(host) + 1);
    strcpy(host_, host);
    user_ = (char *)malloc(strlen(user) + 1);
    strcpy(user_, user);
    password_ = (char *)malloc(strlen(password) + 1);
    strcpy(password_, password);
    port_ = port;
    dbname_ = (char *)malloc(strlen(dbname) + 1);
    strcpy(dbname_, dbname);
}

} /* namespace mysql */
} /* namespace marco */
#endif /* __cplusplus */